home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / util / gnu / diff_2_3.lha / diff-2.3 / amiga-diff.diffs < prev    next >
Text File  |  1993-05-26  |  27KB  |  1,078 lines

  1. diff -cr ram:diff-2.3/alloca.c dh1:diff-2.3/alloca.c
  2. *** ram:diff-2.3/alloca.c    Wed May 12 01:23:34 1993
  3. --- dh1:diff-2.3/alloca.c    Wed May 26 20:18:59 1993
  4. ***************
  5. *** 74,79 ****
  6. --- 74,83 ----
  7.      STACK_DIRECTION < 0 => grows toward lower addresses
  8.      STACK_DIRECTION = 0 => direction of growth unknown  */
  9.   
  10. + #ifdef AMIGA
  11. + #define    STACK_DIRECTION    -1
  12. + #endif /* AMIGA */
  13.   #ifndef STACK_DIRECTION
  14.   #define    STACK_DIRECTION    0    /* Direction unknown.  */
  15.   #endif
  16. diff -cr ram:diff-2.3/cmp.c dh1:diff-2.3/cmp.c
  17. *** ram:diff-2.3/cmp.c    Wed Jul 08 21:58:06 1992
  18. --- dh1:diff-2.3/cmp.c    Wed May 26 20:19:00 1993
  19. ***************
  20. *** 28,33 ****
  21. --- 28,36 ----
  22.   int cmp ();
  23.   void printc ();
  24.   void error ();
  25. + #ifdef AMIGA
  26. + void fake_stat_result ();
  27. + #endif /* AMIGA */
  28.   
  29.   /* Name under which this program was invoked.  */
  30.   char *program_name;
  31. ***************
  32. *** 166,175 ****
  33. --- 169,191 ----
  34.       usage ("at least one filename should be specified");
  35.       }
  36.   
  37. + #ifndef AMIGA
  38.     if (fstat (file1_desc, &stat_buf1) < 0)
  39.       error (2, errno, "%s", file1);
  40.     if (fstat (file2_desc, &stat_buf2) < 0)
  41.       error (2, errno, "%s", file2);
  42. + #else /* AMIGA */
  43. +   if (file1_desc != 0)
  44. +     if (fstat (file1_desc, &stat_buf1) < 0)
  45. +       error (2, errno, "%s", file1);
  46. +   else
  47. +     fake_stat_result (&stat_buf1);
  48. +   if (file2_desc != 0)
  49. +     if (fstat (file2_desc, &stat_buf2) < 0)
  50. +       error (2, errno, "%s", file2);
  51. +   else
  52. +     fake_stat_result (&stat_buf2);
  53. + #endif /* AMIGA */
  54.   
  55.     /* If both the input descriptors are associated with plain files,
  56.        we can make the job simpler in some cases.  */
  57. ***************
  58. *** 185,190 ****
  59. --- 201,207 ----
  60.   
  61.         /* If output is redirected to "/dev/null", we may assume `-s'.  */
  62.   
  63. + #ifndef AMIGA
  64.         if (comparison_type != type_status)
  65.       {
  66.         struct stat sb;
  67. ***************
  68. *** 200,205 ****
  69. --- 217,223 ----
  70.           comparison_type = type_status;
  71.           }
  72.       }
  73. + #endif /* AMIGA */
  74.   
  75.         /* If only a return code is needed, conclude that
  76.        the files differ if they have different sizes.  */
  77. ***************
  78. *** 510,512 ****
  79. --- 528,548 ----
  80.     while (--width > 0)
  81.       putc (' ', fs);
  82.   }
  83. + #ifdef AMIGA
  84. + void fake_stat_result (sbuf)
  85. +      struct stat *sbuf;
  86. + {
  87. +   time_t cur_time;
  88. +   time (&cur_time);
  89. +   sbuf->st_dev = 0;
  90. +   sbuf->st_ino = 0;
  91. +   sbuf->st_mode = S_IREAD;
  92. +   sbuf->st_nlink = 1;
  93. +   sbuf->st_uid = 0;
  94. +   sbuf->st_gid = 0;
  95. +   sbuf->st_size = 0;
  96. +   sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = cur_time;
  97. + }
  98. + #endif /* AMIGA */
  99. diff -cr ram:diff-2.3/diff.c dh1:diff-2.3/diff.c
  100. *** ram:diff-2.3/diff.c    Fri Apr 23 19:18:44 1993
  101. --- dh1:diff-2.3/diff.c    Wed May 26 20:19:40 1993
  102. ***************
  103. *** 41,46 ****
  104. --- 41,49 ----
  105.   static void add_regexp();
  106.   static void specify_style ();
  107.   static void usage ();
  108. + #ifdef AMIGA
  109. + static int fake_stat_result ();
  110. + #endif /* AMIGA */
  111.   
  112.   /* Nonzero for -r: if comparing two directories,
  113.      compare their common subdirectories recursively.  */
  114. ***************
  115. *** 727,734 ****
  116. --- 730,760 ----
  117.     if (name1 == 0)
  118.       name1 = name0;
  119.   
  120. + #ifndef AMIGA
  121.     inf[0].name = dir0 == 0 ? name0 : concat (dir0, "/", name0);
  122.     inf[1].name = dir1 == 0 ? name1 : concat (dir1, "/", name1);
  123. + #else /* AMIGA */
  124. +   {
  125. +     int len;
  126. +     if (dir0 != 0) len = strlen (dir0);
  127. +     if (dir0 == 0 || len == 0)
  128. +       inf[0].name = name0;
  129. +     else if (dir0[len-1] == ':')
  130. +       inf[0].name = concat (dir0, "", name0);
  131. +     else
  132. +       inf[0].name = concat (dir0, "/", name0);
  133. +   }
  134. +   {
  135. +     int len;
  136. +     if (dir1 != 0) len = strlen (dir1);
  137. +     if (dir1 == 0 || len == 0)
  138. +       inf[1].name = name1;
  139. +     else if (dir1[len-1] == ':')
  140. +       inf[1].name = concat (dir1, "", name1);
  141. +     else
  142. +       inf[1].name = concat (dir1, "/", name1);
  143. +   }
  144. + #endif /* AMIGA */
  145.   
  146.     /* Stat the files.  Record whether they are directories.  */
  147.   
  148. ***************
  149. *** 745,751 ****
  150. --- 771,781 ----
  151.           {
  152.             inf[i].desc = 0;
  153.             inf[i].name = "Standard Input";
  154. + #ifndef AMIGA
  155.             stat_result = fstat (0, &inf[i].stat);
  156. + #else /* AMIGA */
  157. +           stat_result = fake_stat_result (&inf[i].stat);
  158. + #endif /* AMIGA */
  159.           }
  160.         else
  161.           stat_result = stat (inf[i].name, &inf[i].stat);
  162. ***************
  163. *** 770,780 ****
  164. --- 800,828 ----
  165.         /* If one is a directory, and it was specified in the command line,
  166.        use the file in that dir with the other file's basename.  */
  167.   
  168. + #ifndef AMIGA
  169.         int fnm_arg = inf[0].dir_p;
  170.         int dir_arg = 1 - fnm_arg;
  171.         char *p = rindex (inf[fnm_arg].name, '/');
  172.         char *filename = inf[dir_arg].name
  173.       = concat (inf[dir_arg].name,  "/", (p ? p+1 : inf[fnm_arg].name));
  174. + #else /* AMIGA */
  175. +       int fnm_arg, dir_arg;
  176. +       char *p1, *p2, *p;
  177. +       char *filename;
  178. +       fnm_arg = inf[0].dir_p;
  179. +       dir_arg = 1 - fnm_arg;
  180. +       p1 = rindex (inf[fnm_arg].name, '/');
  181. +       p2 = rindex (inf[fnm_arg].name, ':');
  182. +       p = max (p1, p2);
  183. +       if (*(inf[dir_arg].name + strlen (inf[dir_arg].name) - 1) == ':')
  184. +         filename = inf[dir_arg].name
  185. +           = concat (inf[dir_arg].name, "", (p ? p+1 : inf[fnm_arg].name));
  186. +       else
  187. +         filename = inf[dir_arg].name
  188. +           = concat (inf[dir_arg].name, "/", (p ? p+1 : inf[fnm_arg].name));
  189. + #endif /* !AMIGA */
  190.   
  191.         if (inf[fnm_arg].desc == 0)
  192.       fatal ("can't compare - to a directory");
  193. ***************
  194. *** 918,927 ****
  195. --- 966,1001 ----
  196.     else
  197.       fflush (stdout);
  198.   
  199. + #ifndef AMIGA
  200.     if (dir0 != 0)
  201.       free (inf[0].name);
  202.     if (dir1 != 0)
  203.       free (inf[1].name);
  204. + #else /* AMIGA */
  205. +   if (dir0 != 0 && strlen(dir0) != 0)
  206. +     free (inf[0].name);
  207. +   if (dir1 != 0 && strlen(dir1) != 0)
  208. +     free (inf[1].name);
  209. + #endif /* !AMIGA */
  210.   
  211.     return val;
  212.   }
  213. + #ifdef AMIGA
  214. + static int fake_stat_result (sbuf)
  215. +      struct stat *sbuf;
  216. + {
  217. +   time_t cur_time;
  218. +   time (&cur_time);
  219. +   sbuf->st_dev = 0;
  220. +   sbuf->st_ino = 0;
  221. +   sbuf->st_mode = S_IREAD;
  222. +   sbuf->st_nlink = 1;
  223. +   sbuf->st_uid = 0;
  224. +   sbuf->st_gid = 0;
  225. +   sbuf->st_size = 0;
  226. +   sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = cur_time;
  227. +   return 0;
  228. + }
  229. + #endif /* AMIGA */
  230. diff -cr ram:diff-2.3/diff3.c dh1:diff-2.3/diff3.c
  231. *** ram:diff-2.3/diff3.c    Fri Apr 23 19:18:44 1993
  232. --- dh1:diff-2.3/diff3.c    Wed May 26 20:52:39 1993
  233. ***************
  234. *** 28,33 ****
  235. --- 28,43 ----
  236.   #include "getopt.h"
  237.   #include "system.h"
  238.   
  239. + #ifdef AMIGA
  240. + #include <signal.h>
  241. + #include <exec/types.h>
  242. + #include <dos/dostags.h>
  243. + #include <proto/dos.h>
  244. + #include <proto/exec.h>
  245. + extern struct DosLibrary *DOSBase;
  246. + #endif /* AMIGA */
  247.   /*
  248.    * Internal data structures and macros for the diff3 program; includes
  249.    * data structures for both diff3 diffs and normal diffs.
  250. ***************
  251. *** 243,248 ****
  252. --- 253,265 ----
  253.     char **file;
  254.     struct stat statb;
  255.   
  256. + #ifdef AMIGA
  257. +   if (DOSBase->dl_lib.lib_Version < 37) {
  258. +     fputs ("Need Amiga OS 2.0 (V.37) to execute.\n", stderr);
  259. +     exit (20);
  260. +   }
  261. + #endif /* AMIGA */
  262.     incompat = 0;
  263.   
  264.     argv0 = argv[0];
  265. ***************
  266. *** 1100,1105 ****
  267. --- 1117,1124 ----
  268.        char *filea, *fileb;
  269.        char **output_placement;
  270.   {
  271. + #ifndef AMIGA
  272.     char *argv[7];
  273.     char horizon_arg[256];
  274.     char **ap;
  275. ***************
  276. *** 1146,1151 ****
  277. --- 1165,1243 ----
  278.       perror_with_exit ("fork failed");
  279.   
  280.     close (fds[1]);        /* Prevent erroneous lack of EOF */
  281. + #else /* AMIGA */
  282. +   static char diff_command_line[256];
  283. +   char horizon_arg[100];
  284. +   int fds[2];
  285. +   char *diff_result;
  286. +   int current_chunk_size;
  287. +   int bytes;
  288. +   int total;
  289. +   void (*oldsigint)();
  290. +   static long num_invocations = 0;
  291. +   char pipe_name[20];
  292. +   struct Task *Task;
  293. +   struct TagItem STags[5];
  294. +   BPTR StdOutDiff;
  295. +   /* The user should not be able to break the program while the child
  296. +      process is being executed, otherwise the child process will still
  297. +      be writing to the pipe-device until it deadlocks because there is
  298. +      no reader on the other side of the pipe. So prohibit breaking the
  299. +      program until the pipe is closed. */
  300. +   oldsigint = signal (SIGINT, SIG_IGN);
  301. +   /* Construct command line. Enclose filenames in double quotes in
  302. +      case the user specifies files with spaces in their names. */
  303. +   strcpy (diff_command_line, diff_program);
  304. +   if (always_text)
  305. +     strcat (diff_command_line, " -a");
  306. +   sprintf (horizon_arg, " --horizon-lines=%d", horizon_lines);
  307. +   strcat (diff_command_line, horizon_arg);
  308. +   strcat (diff_command_line, " --");
  309. +   strcat (diff_command_line, " \"");
  310. +   strcat (diff_command_line, filea);
  311. +   strcat (diff_command_line, "\" \"");
  312. +   strcat (diff_command_line, fileb);
  313. +   strcat (diff_command_line, "\"");
  314. +   /* Construct filename for the pipe to be used */
  315. +   Task = FindTask (NULL);
  316. +   num_invocations++;
  317. +   sprintf (pipe_name, "PIPE:%08lX_%ld", Task, num_invocations);
  318. +   /* Open pipe for child process */
  319. +   StdOutDiff = Open (pipe_name, MODE_NEWFILE);
  320. +   if (!StdOutDiff)
  321. +     perror_with_exit ("pipe failed");
  322. +   /* Child process runs asynchronously with pipe as stdout */
  323. +   STags[0].ti_Tag = SYS_Input;
  324. +   STags[0].ti_Data = NULL;
  325. +   STags[1].ti_Tag = SYS_Output;
  326. +   STags[1].ti_Data = StdOutDiff;
  327. +   STags[2].ti_Tag = SYS_Asynch;
  328. +   STags[2].ti_Data = TRUE;
  329. +   STags[3].ti_Tag = SYS_UserShell;
  330. +   STags[3].ti_Data = TRUE;
  331. +   STags[4].ti_Tag = TAG_DONE;
  332. +   /* Start child process */
  333. +   if ((System (diff_command_line, STags)) != 0) {
  334. +     Close (StdOutDiff);
  335. +     perror_with_exit ("diff: not found");
  336. +   }
  337. +   /* Open pipe for this side of the communication */
  338. +   fds[0] = open (pipe_name, O_RDONLY);
  339. +   if (fds[0] < 0) {
  340. +     Close (StdOutDiff);
  341. +     perror_with_exit ("pipe failed");
  342. +   }
  343. + #endif /* !AMIGA */
  344.     current_chunk_size = DIFF_CHUNK_SIZE;
  345.     diff_result = (char *) xmalloc (current_chunk_size);
  346.     total = 0;
  347. ***************
  348. *** 1163,1168 ****
  349. --- 1255,1261 ----
  350.   
  351.     *output_placement = diff_result;
  352.   
  353. + #ifndef AMIGA
  354.     do
  355.       if ((w = wait (&wstatus)) == -1)
  356.         perror_with_exit ("wait failed");
  357. ***************
  358. *** 1170,1175 ****
  359. --- 1263,1274 ----
  360.   
  361.     if (! (WIFEXITED (wstatus) && WEXITSTATUS (wstatus) < 2))
  362.       fatal ("subsidiary diff failed");
  363. + #else /* AMIGA */
  364. +   /* Close pipe */
  365. +   close (fds[0]);
  366. +   /* Re-install break-handler */
  367. +   signal (SIGINT, oldsigint);
  368. + #endif /* !AMIGA */
  369.   
  370.     return diff_result + total;
  371.   }
  372. diff -cr ram:diff-2.3/fnmatch.c dh1:diff-2.3/fnmatch.c
  373. *** ram:diff-2.3/fnmatch.c    Fri Apr 16 18:24:54 1993
  374. --- dh1:diff-2.3/fnmatch.c    Wed May 26 20:30:25 1993
  375. ***************
  376. *** 20,26 ****
  377. --- 20,30 ----
  378.   #endif
  379.   
  380.   #include <errno.h>
  381. + #ifndef AMIGA
  382.   #include <fnmatch.h>
  383. + #else /* AMIGA */
  384. + #include "fnmatch.h"
  385. + #endif /* !AMIGA */
  386.   #include <ctype.h>
  387.   
  388.   
  389. diff -cr ram:diff-2.3/getopt.c dh1:diff-2.3/getopt.c
  390. *** ram:diff-2.3/getopt.c    Fri May 07 21:29:58 1993
  391. --- dh1:diff-2.3/getopt.c    Wed May 26 20:20:26 1993
  392. ***************
  393. *** 42,50 ****
  394. --- 42,52 ----
  395.   #endif /* alloca.h */
  396.   #endif /* not __GNUC__ */
  397.   
  398. + #ifndef AMIGA
  399.   #if !__STDC__ && !defined(const) && IN_GCC
  400.   #define const
  401.   #endif
  402. + #endif /* !AMIGA */
  403.   
  404.   /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.  */
  405.   #ifndef _NO_PROTO
  406. diff -cr ram:diff-2.3/getopt1.c dh1:diff-2.3/getopt1.c
  407. *** ram:diff-2.3/getopt1.c    Fri May 07 21:29:54 1993
  408. --- dh1:diff-2.3/getopt1.c    Wed May 26 20:20:27 1993
  409. ***************
  410. *** 22,30 ****
  411. --- 22,32 ----
  412.   
  413.   #include "getopt.h"
  414.   
  415. + #ifndef AMIGA
  416.   #if !__STDC__ && !defined(const) && IN_GCC
  417.   #define const
  418.   #endif
  419. + #endif /* !AMIGA */
  420.   
  421.   #include <stdio.h>
  422.   
  423. diff -cr ram:diff-2.3/sdiff.c dh1:diff-2.3/sdiff.c
  424. *** ram:diff-2.3/sdiff.c    Thu Feb 11 09:39:42 1993
  425. --- dh1:diff-2.3/sdiff.c    Wed May 26 20:20:51 1993
  426. ***************
  427. *** 25,30 ****
  428. --- 25,39 ----
  429.   #include <signal.h>
  430.   #include "getopt.h"
  431.   
  432. + #ifdef AMIGA
  433. + #include <exec/types.h>
  434. + #include <dos/dostags.h>
  435. + #include <proto/exec.h>
  436. + #include <proto/dos.h>
  437. + extern struct DosLibrary *DOSBase;
  438. + #endif /* AMIGA */
  439.   #ifndef SEEK_SET
  440.   #define SEEK_SET 0
  441.   #endif
  442. ***************
  443. *** 49,69 ****
  444. --- 58,93 ----
  445.   
  446.   static char *tmpname;
  447.   static int volatile tmpmade;
  448. + #ifndef AMIGA
  449.   static pid_t volatile diffpid;
  450. + #endif /* !AMIGA */
  451.   
  452.   struct line_filter;
  453.   static void diffarg (); /* (char *); */
  454.   static void execdiff (); /* (int, char const *, char const *, char const *); */
  455. + #ifdef AMIGA
  456. + char *xmalloc ();
  457. + static void amiga_exit ();
  458. + static int amiga_break ();
  459. + static void construct_pipe_name ();
  460. + static void construct_command_line ();
  461. + static char command_line[512];
  462. + static FILE *diff_file = NULL;
  463. + static int user_quit = 0;
  464. + #endif /* AMIGA */
  465.   static int edit (); /* (struct line_filter *left, int lenl, struct
  466.                  line_filter *right, int lenr, FILE *outfile); */
  467.   static int interact (); /* (struct line_filter *diff,
  468.                 struct line_filter *left,
  469.                 struct line_filter *right, FILE *outfile); */
  470. + #ifndef AMIGA
  471.   static void trapsigs (); /* (void); */
  472.   /* this lossage until the gnu libc conquers the universe */
  473.   #define TMPNAMSIZE 1024
  474.   #define PVT_tmpdir "/tmp"
  475.   static char *private_tempnam (); /* (const char *, const char *, int, int *); */
  476. + #endif /* !AMIGA */
  477.   static int diraccess ();
  478.   
  479.   /* Options: */
  480. ***************
  481. *** 108,120 ****
  482. --- 132,185 ----
  483.     exit (2);
  484.   }
  485.   
  486. + #ifdef AMIGA
  487. + static void
  488. + amiga_exit ()
  489. + {
  490. +   char *buf;
  491. +   size_t a;
  492. +   if (tmpmade)
  493. +     {
  494. +       remove (tmpname);
  495. +       tmpmade = 0;
  496. +     }
  497. +   if (diff_file)
  498. +     {
  499. +       /* Provide empty pipe! */
  500. +       buf = xmalloc (SDIFF_BUFSIZE);
  501. +       do
  502. +         a = fread (buf, sizeof (char), SDIFF_BUFSIZE, diff_file);
  503. +       while (a == SDIFF_BUFSIZE);
  504. +       fclose (diff_file);
  505. +       diff_file = NULL;
  506. +       free (buf);
  507. +     }
  508. + }
  509. + static int
  510. + amiga_break ()
  511. + {
  512. +   amiga_exit ();
  513. +   return 20;
  514. + }
  515. + #endif /* AMIGA */
  516.   static void
  517.   cleanup ()
  518.   {
  519. + #ifndef AMIGA
  520.     if (0 < diffpid)
  521.       kill (diffpid, SIGPIPE);
  522.     if (tmpmade)
  523.       unlink (tmpname);
  524. + #else /* AMIGA */
  525. +   if (tmpmade)
  526. +     {
  527. +       remove (tmpname);
  528. +       tmpmade = 0;
  529. +     }
  530. + #endif /* !AMIGA */
  531.   }
  532.   
  533.   static void
  534. ***************
  535. *** 230,235 ****
  536. --- 295,301 ----
  537.   }
  538.   #endif
  539.   
  540. + #ifndef AMIGA
  541.   #ifndef HAVE_WAITPID
  542.   /* Emulate waitpid well enough for sdiff, which has at most two children.  */
  543.   static pid_t
  544. ***************
  545. *** 259,264 ****
  546. --- 325,331 ----
  547.     return pid;
  548.   }
  549.   #endif
  550. + #endif /* !AMIGA */
  551.   
  552.   static char const *
  553.   expand_name (name, isdir, other_name)
  554. ***************
  555. *** 273,278 ****
  556. --- 340,346 ----
  557.     else
  558.       {
  559.         /* Yield NAME/BASE, where BASE is OTHER_NAME's basename.  */
  560. + #ifndef AMIGA
  561.         const char
  562.       *p = rindex (other_name, '/'),
  563.       *base = p ? p+1 : other_name;
  564. ***************
  565. *** 282,287 ****
  566. --- 350,381 ----
  567.         r[namelen] = '/';
  568.         bcopy (base, r + namelen + 1, baselen + 1);
  569.         return r;
  570. + #else /* AMIGA */
  571. +       const char *p1, *p2, *base;
  572. +       size_t namelen, baselen;
  573. +       char *r;
  574. +       p1 = rindex (other_name, '/');
  575. +       p2 = rindex (other_name, ':');
  576. +       if (p1 == NULL && p2 == NULL)
  577. +         base = other_name;
  578. +       else
  579. +         base = max (p1 + 1 , p2 + 1);
  580. +       namelen = strlen (name);
  581. +       baselen = strlen (base);
  582. +       r = xmalloc (namelen + baselen + 2);
  583. +       bcopy (name, r, namelen);
  584. +       if (name[namelen-1] != ':')
  585. +         {
  586. +           r[namelen] = '/';
  587. +           bcopy (base, r + namelen + 1, baselen + 1);
  588. +         }
  589. +       else
  590. +         {
  591. +           bcopy (base, r + namelen, baselen + 1);
  592. +         }
  593. +       return r;
  594. + #endif /* AMIGA */
  595.       }
  596.   }
  597.   
  598. ***************
  599. *** 409,414 ****
  600. --- 503,520 ----
  601.     char *editor = getenv ("EDITOR");
  602.     char *differ = getenv ("DIFF");
  603.   
  604. + #ifdef AMIGA
  605. +   if (DOSBase->dl_lib.lib_Version < 37) {
  606. +     fputs ("Need Amiga OS 2.0 (V.37) to execute.\n", stderr);
  607. +     exit (20);
  608. +   }
  609. +   /* Install break and exit traps */
  610. +   if (atexit (&amiga_exit))
  611. +     fatal ("couldn't set exit trap");
  612. +   if (onbreak (&amiga_break))
  613. +     fatal ("couldn't set break trap");
  614. + #endif /* AMIGA */
  615.     prog = argv[0];
  616.     if (editor)
  617.       edbin = editor;
  618. ***************
  619. *** 496,508 ****
  620. --- 602,620 ----
  621.   
  622.     if (! out_file)
  623.       /* easy case: diff does everything for us */
  624. + #ifndef AMIGA
  625.       execdiff (suppress_common_flag, "-y", argv[optind], argv[optind + 1]);
  626. + #else /* AMIGA */
  627. +     execdiff (suppress_common_flag, "-y", argv[optind], argv[optind + 1], FALSE, NULL);
  628. + #endif /* !AMIGA */
  629.     else
  630.       {
  631.         FILE *left, *right, *out, *diffout;
  632.         int diff_fds[2];
  633.         int interact_ok;
  634. + #ifndef AMIGA
  635.         pid_t pid;
  636. + #endif
  637.         struct line_filter lfilt;
  638.         struct line_filter rfilt;
  639.         struct line_filter diff_filt;
  640. ***************
  641. *** 517,522 ****
  642. --- 629,636 ----
  643.         right = ck_fopen (expand_name (argv[optind + 1], rightdir, argv[optind]), "r");
  644.         out = ck_fopen (out_file, "w");
  645.   
  646. + #ifndef AMIGA
  647.         if (pipe (diff_fds))
  648.       perror_fatal ("pipe");
  649.   
  650. ***************
  651. *** 545,562 ****
  652. --- 659,709 ----
  653.         close (diff_fds[1]);
  654.         diffout = ck_fdopen (diff_fds[0], "r");
  655.   
  656. + #else /* AMIGA */
  657. +       {
  658. +         BPTR StdOutDiff;
  659. +         char pipe_name[20];
  660. +         construct_pipe_name (pipe_name);
  661. +         StdOutDiff = Open (pipe_name, MODE_NEWFILE);
  662. +         if (!StdOutDiff)
  663. +           perror_fatal ("pipe");
  664. +         diff_fds[0] = open (pipe_name, O_RDONLY);
  665. +         if (diff_fds[0] == -1)
  666. +           perror_fatal ("pipe");
  667. +         execdiff (0, "--sdiff-merge-assist", argv[optind], argv[optind + 1], TRUE, StdOutDiff);
  668. +       }
  669. +       diffout = ck_fdopen (diff_fds[0], "r");
  670. +       diff_file = diffout;
  671. + #endif /* !AMIGA */
  672.         lf_init (&diff_filt, diffout);
  673.         lf_init (&lfilt, left);
  674.         lf_init (&rfilt, right);
  675.   
  676.         interact_ok = interact (&diff_filt, &lfilt, &rfilt, out);
  677.   
  678. + #ifndef AMIGA
  679.         ck_fclose (diffout);
  680. + #else /* AMIGA */
  681. +       /* If the user signaled quit, let the exit code clean up the
  682. +          pipe and close the file */
  683. +       if (!user_quit)
  684. +         ck_fclose (diffout);
  685. + #endif /* !AMIGA */
  686.         ck_fclose (left);
  687.         ck_fclose (right);
  688.         ck_fclose (out);
  689.   
  690.         {
  691. + #ifndef AMIGA
  692.       int wstatus;
  693.   
  694.       if (waitpid (pid, &wstatus, 0) < 0)
  695. ***************
  696. *** 576,581 ****
  697. --- 723,742 ----
  698.         fatal ("Subsidiary diff failed");
  699.   
  700.       exit (WEXITSTATUS (wstatus));
  701. + #else /* AMIGA */
  702. +     if (tmpmade)
  703. +       {
  704. +         remove (tmpname);
  705. +         tmpmade = 0;
  706. +       }
  707. +     if (! interact_ok)
  708. +       exit (2);
  709. +         diff_file = NULL;
  710. +         exit (0);
  711. + #endif /* !AMIGA */
  712.         }
  713.       }
  714.     return 0;            /* Fool -Wall . . . */
  715. ***************
  716. *** 604,609 ****
  717. --- 765,772 ----
  718.     diffargv[diffargs++] = a;
  719.   }
  720.   
  721. + #ifndef AMIGA
  722.   static void
  723.   execdiff (differences_only, option, file1, file2)
  724.        int differences_only;
  725. ***************
  726. *** 623,631 ****
  727. --- 786,870 ----
  728.     _exit (2);
  729.   }
  730.   
  731. + #else /* AMIGA */
  732. + static void
  733. + execdiff (differences_only, option, file1, file2, asynch, handle)
  734. +      int differences_only;
  735. +      char *option, *file1, *file2;
  736. +      long asynch;
  737. +      BPTR handle;
  738. + {
  739. +   struct TagItem STags[5];
  740. +   if (differences_only)
  741. +     diffarg ("--suppress-common-lines");
  742. +   diffarg (option);
  743. +   diffarg ("--");
  744. +   diffarg (file1);
  745. +   diffarg (file2);
  746. +   diffarg (0);
  747. +   construct_command_line (diffbin, diffargv, command_line);
  748. +   if (asynch)
  749. +     {
  750. +       STags[0].ti_Tag = SYS_Input;
  751. +       STags[0].ti_Data = NULL;
  752. +       STags[1].ti_Tag = SYS_Output;
  753. +       STags[1].ti_Data = handle;
  754. +       STags[2].ti_Tag = SYS_Asynch;
  755. +       STags[2].ti_Data = TRUE;
  756. +       STags[3].ti_Tag = SYS_UserShell;
  757. +       STags[3].ti_Data = TRUE;
  758. +       STags[4].ti_Tag = TAG_DONE;
  759. +       if (System (command_line, STags) != 0)
  760. +         perror_fatal ("diff not found");
  761. +     }
  762. +   else
  763. +     {
  764. +       STags[0].ti_Tag = SYS_Asynch;
  765. +       STags[0].ti_Data = FALSE;
  766. +       STags[1].ti_Tag = SYS_UserShell;
  767. +       STags[1].ti_Data = TRUE;
  768. +       STags[2].ti_Tag = TAG_DONE;
  769. +       if (System (command_line, STags) != 0)
  770. +         perror_fatal ("diff not found");
  771. +       exit (0);
  772. +     }
  773. + }
  774. + static void
  775. + construct_command_line (binname, argvec, com_line)
  776. +      char *binname, **argvec, *com_line;
  777. + {
  778. +   int i;
  779. +   strcpy (com_line, binname);
  780. +   for (i = 1; argvec[i]; i++)
  781. +     {
  782. +       /* Enclose arguments in quotes */
  783. +       strcat (com_line, " \"");
  784. +       strcat (com_line, argvec[i]);
  785. +       strcat (com_line, "\"");
  786. +     }
  787. + }
  788. + static void
  789. + construct_pipe_name (pipe_name)
  790. +      char *pipe_name;
  791. + {
  792. +   static long invocations = 0;
  793. +   struct Task *Task;
  794. +   Task = FindTask (NULL);
  795. +   sprintf (pipe_name, "PIPE:%08lX_%ld", Task, invocations);
  796. + }
  797. + #endif /* !AMIGA */
  798.   
  799.   
  800.   
  801. + #ifndef AMIGA
  802.   /* Signal handling */
  803.   
  804.   static int volatile ignore_signals;
  805. ***************
  806. *** 670,675 ****
  807. --- 909,915 ----
  808.       if (signal (*p, SIG_IGN) != SIG_IGN  &&  signal (*p, catchsig) != SIG_IGN)
  809.         fatal ("signal error");
  810.   }
  811. + #endif /* !AMIGA */
  812.   
  813.   
  814.   
  815. ***************
  816. *** 796,802 ****
  817. --- 1036,1046 ----
  818.         suppress_common_flag = 0;
  819.         break;
  820.       case 'q':
  821. + #ifdef AMIGA
  822. +           user_quit = 1;
  823. + #endif
  824.         return 0;
  825. + #ifndef AMIGA
  826.       case 'e':
  827.         if (! tmpname && ! (tmpname = private_tempnam (0, "sdiff", 1, 0)))
  828.           perror_fatal ("temporary file name");
  829. ***************
  830. *** 869,874 ****
  831. --- 1113,1172 ----
  832.           }
  833.           return 1;
  834.         }
  835. + #else /* AMIGA */
  836. +     case 'e':
  837. +           if (! tmpname && ! (tmpname = tmpnam (NULL)))
  838. +         perror_fatal ("temporary file name");
  839. +       tmpmade = 1;
  840. +       {
  841. +         FILE *tmp;
  842. +             tmp = ck_fopen (tmpname, "w");
  843. +         if (cmd1 == 'l' || cmd1 == 'b')
  844. +           lf_copy (left, lenl, tmp);
  845. +         else
  846. +           lf_skip (left, lenl);
  847. +         if (cmd1 == 'r' || cmd1 == 'b')
  848. +           lf_copy (right, lenr, tmp);
  849. +         else
  850. +           lf_skip (right, lenr);
  851. +         ck_fclose (tmp);
  852. +             {
  853. +               struct TagItem STags[3];
  854. +               sprintf (command_line, "%s \"%s\"", edbin, tmpname);
  855. +               STags[0].ti_Tag = SYS_Asynch;
  856. +               STags[0].ti_Data = FALSE;
  857. +               STags[1].ti_Tag = SYS_UserShell;
  858. +               STags[1].ti_Data = TRUE;
  859. +               STags[2].ti_Tag = TAG_DONE;
  860. +               if (System (command_line, STags) != 0)
  861. +                 perror_fatal ("Subsidiary editor failed");
  862. +         }
  863. +         {
  864. +           static char *buf;
  865. +           size_t size;
  866. +               tmp = ck_fopen (tmpname, "r");
  867. +               buf = xmalloc (SDIFF_BUFSIZE * sizeof (char));
  868. +           while ((size = ck_fread (buf, SDIFF_BUFSIZE, tmp)) != 0)
  869. +         ck_fwrite (buf, size, outfile);
  870. +               free (buf);
  871. +           ck_fclose (tmp);
  872. +         }
  873. +         return 1;
  874. +       }
  875. + #endif /* !AMIGA */
  876.       default:
  877.         give_help ();
  878.         break;
  879. ***************
  880. *** 959,964 ****
  881. --- 1257,1264 ----
  882.     return stat (file, &buf) == 0;
  883.   }
  884.   
  885. + #ifndef AMIGA
  886.   /* These are the characters used in temporary filenames.  */
  887.   static const char letters[] =
  888.     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  889. ***************
  890. *** 1065,1067 ****
  891. --- 1365,1369 ----
  892.       *lenptr = len;
  893.     return buf;
  894.   }
  895. + #endif /* AMIGA */
  896. diff -cr ram:diff-2.3/util.c dh1:diff-2.3/util.c
  897. *** ram:diff-2.3/util.c    Thu Nov 12 17:02:18 1992
  898. --- dh1:diff-2.3/util.c    Wed May 26 20:21:13 1993
  899. ***************
  900. *** 19,24 ****
  901. --- 19,35 ----
  902.   
  903.   #include "diff.h"
  904.   
  905. + #ifdef AMIGA
  906. + #include <signal.h>
  907. + #include <exec/types.h>
  908. + #include <dos/dostags.h>
  909. + #include <proto/dos.h>
  910. + #include <proto/exec.h>
  911. + extern struct DosLibrary *DOSBase;
  912. + static char tmpfilename[L_tmpnam];
  913. + #endif /* AMIGA */
  914.   /* Use when a system call returns non-zero status.
  915.      TEXT should normally be the file name.  */
  916.   
  917. ***************
  918. *** 154,159 ****
  919. --- 165,171 ----
  920.     strcat (name, current_name1);
  921.   
  922.     if (paginate_flag)
  923. + #ifndef AMIGA
  924.       {
  925.         int pipes[2];
  926.         int desc;
  927. ***************
  928. *** 187,192 ****
  929. --- 199,224 ----
  930.         outfile = fdopen (pipes[1], "w");
  931.       } 
  932.       }
  933. + #else /* AMIGA */
  934. +     {
  935. +       if (DOSBase->dl_lib.lib_Version < 37)
  936. +     {
  937. +       fputs ("Need Amiga OS 2.0 (V.37) to paginate. ", stderr);
  938. +       fputs ("Using stdout instead.\n", stderr);
  939. +       outfile = stdout;
  940. +     }
  941. +       else
  942. +     {
  943. +       /* Output the differences to a file and process the file with
  944. +        * pr later on. This is a really bad hack (a kluge??? :-) ),
  945. +        * but I couldn't find something better... */
  946. +       tmpnam (tmpfilename);
  947. +       outfile = fopen (tmpfilename, "w");
  948. +       if (outfile == NULL)
  949. +         pfatal_with_name ("pipe");
  950. +     }
  951. +     }
  952. + #endif
  953.     else
  954.       {
  955.   
  956. ***************
  957. *** 225,234 ****
  958. --- 257,308 ----
  959.   finish_output ()
  960.   {
  961.     if (outfile != 0 && outfile != stdout)
  962. + #ifndef AMIGA
  963.       {
  964.         fclose (outfile);
  965.         wait (0);
  966.       }
  967. + #else /* AMIGA */
  968. +     {
  969. +       char *command_line;
  970. +       struct TagItem STags[5];
  971. +       BPTR StdInPr;
  972. +       /* Close the temporary file and run pr with this file as input */
  973. +       fclose (outfile);
  974. +       command_line = (char *) xmalloc (strlen (current_name0)
  975. +                        + strlen (current_name1)
  976. +                        + strlen (switch_string) + 30);
  977. +       strcpy (command_line, "pr -f -h \"");
  978. +       strcat (command_line, "diff");
  979. +       strcat (command_line, switch_string);
  980. +       strcat (command_line, " ");
  981. +       strcat (command_line, current_name0);
  982. +       strcat (command_line, " ");
  983. +       strcat (command_line, current_name1);
  984. +       strcat (command_line, "\"");
  985. +       StdInPr = Open (tmpfilename, MODE_OLDFILE);
  986. +       if (StdInPr == NULL)
  987. +     pfatal_with_name ("pipe");
  988. +       STags[0].ti_Tag = SYS_Input;
  989. +       STags[0].ti_Data = StdInPr;
  990. +       STags[1].ti_Tag = SYS_Output;
  991. +       STags[1].ti_Data = Output ();
  992. +       STags[2].ti_Tag = SYS_Asynch;
  993. +       STags[2].ti_Data = FALSE;
  994. +       STags[3].ti_Tag = SYS_UserShell;
  995. +       STags[3].ti_Data = TRUE;
  996. +       STags[4].ti_Tag = TAG_DONE;
  997. +       if (System (command_line, STags) != 0)
  998. +     {
  999. +       Close (StdInPr);
  1000. +       DeleteFile (tmpfilename);
  1001. +       pfatal_with_name ("pr");
  1002. +     }
  1003. +       Close (StdInPr);
  1004. +       DeleteFile (tmpfilename);
  1005. +     }
  1006. + #endif /* !AMIGA */
  1007.   
  1008.     outfile = 0;
  1009.   }
  1010.